package com.sky.task;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sky.constant.MessageConstant;
import com.sky.entity.Orders;
import com.sky.exception.OrderBusinessException;
import com.sky.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单状态处理
 *
 * @Author mr.lcc
 * @Data 2025/5/28 20:05
 */
@Component
@Slf4j
public class OrderStatusHandleTask {

    @Autowired
    private OrderService orderService;

    @Scheduled(cron = "${my.task.cronOne}")
    public void task01() {
        log.info("定时任务类触发，开始处理订单！");
        // 1.根据条件获取订单信息。 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款
        LambdaQueryWrapper<Orders> ordersWrapper = new LambdaQueryWrapper<>();
        ordersWrapper.eq(Orders::getStatus, Orders.PAID);
        List<Orders> list = orderService.list(ordersWrapper);
        if (CollUtil.isEmpty(list)) {
            log.info("暂无超时订单处理，退出自动任务！");
            return;
        }
        list.forEach(o -> {
            LocalDateTime sysTimeNow = LocalDateTime.now();
            LocalDateTime orderTime = o.getOrderTime();
            // 2.开始处理，判断支付时间是否超过15分装 判断订单的下单时间是否不为空，并且是否早于当前时间 15 分钟之前
            if (orderTime != null && orderTime.isBefore(sysTimeNow.minusMinutes(15))) {
                // 如果满足条件，说明这个订单已经超过了15分钟仍未支付或处理
                // 3.将订单状态设置为“已取消”
                o.setStatus(Orders.CANCELLED);
                // 设置订单取消的原因
                o.setCancelReason(MessageConstant.ORDER_CANCEL_REASON);
            }
        });
        // 4.更新数据库状态
        if (!orderService.updateBatchById(list)) {
            throw new OrderBusinessException("处理超时订单报错！请联系管理员！");
        }
        log.info("定时任务处理订单状态完成处理订单数量:{}", list.size());
    }

    /**
     * 定时任务处理派单中的订单
     */
    @Scheduled(cron = "${my.task.cronTow}")
    public void task02() {
        log.info("定时任务触发，处理派送总中订单！");
        // 1.根据条件获取订单信息。 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款
        LambdaQueryWrapper<Orders> ordersWrapper = new LambdaQueryWrapper<>();
        ordersWrapper.eq(Orders::getStatus, Orders.DELIVERY_IN_PROGRESS);
        List<Orders> list = orderService.list(ordersWrapper);
        if (CollUtil.isEmpty(list)) {
            log.info("暂无派送订单处理，退出自动任务！");
            return;
        }

        // 2.存在凌晨一点派送中订单开始处理
        list.forEach(o -> {
            LocalDateTime sysTimeNow = LocalDateTime.now();
            LocalDateTime orderTime = o.getOrderTime();
            log.info("系统时间{}，订单时间{}", sysTimeNow, orderTime);
            o.setStatus(Orders.CANCELLED);
            o.setCancelReason(MessageConstant.SYSTEM_COMPLETE_ORDER);
        });

        // 3.更新订单
        if (!orderService.updateBatchById(list)) {
            throw new OrderBusinessException("处理超时订单报错！请联系管理员！");
        }
        log.info("定时任务处理订单状态完成处理订单数量:{}", list.size());
    }
}
